const request = require("superagent"),
  async = require('async'),
    eventproxy = require('eventproxy'),
    cheerio = require("cheerio");
    require("superagent-proxy")(request);
const ep = new eventproxy();
const fs = require('fs');
//抓取分类区块和保存文件名数组的设置
var blockCount = 0;
const blockName = ['literature', 'popular', 'culture', 'life', 'management', 'technology'];
const doubanTagUrl = 'https://book.douban.com/tag/';
var TagPageUrl = [],           //存放大分类下每个小分类的连接
  filteredTagPageUrl = [],     //存放过滤后能成功访问的小分类链接
  catchData = [];              //存放对每个大分类抓取到的数据
var blockrow,                  //记录大分类下小分类的行数
  $TagPage;                    // 存放/tag页面的res.text



// 代理隧道验证信息
//   const proxyHost = "proxy.abuyun.com";
//   const proxyPort = 9010;
//   const proxyUser = "abcdefghijklmnop";
//   const proxyPass = "123456789abcdefg";
//   const proxyUrl = "http://" + proxyUser + ":" + proxyPass + "@" + proxyHost + ":" + proxyPort;
  
  const proxyUrl = process.env.http_proxy || 'http://H2D28VDK85DDF49D:02C3E91B91DEC0A6@proxy.abuyun.com:9020';




  /**
   * 获取豆瓣分类浏览页面
   */
  var getDoubanPage = function() {
    request.get(doubanTagUrl).proxy(proxyUrl).end(function(err, res) {
      if (err)
        console.error('访问豆瓣失败，检查IP封锁！');
      else {
        $TagPage = cheerio.load(res.text);
        getFilteredTagUrl($TagPage);
      }
    });
  }
  getDoubanPage()


  /**
   * 获取过滤后可访问的小分类链接
   */
  var getFilteredTagUrl = function($) {
    blockrow = parseInt($('#content > div > div.article > div:nth-child(2) > div:nth-child(' + blockCount + 1 + ') > table td').length / 4);
    for (var i = 1; i <= blockrow; i++) {
      for (var j = 1; j <= 4; j++) {
        TagPageUrl.push('https://book.douban.com' + $('#content > div > div.article > div:nth-child(2) > div:nth-child(' + blockCount + 1 + ') > table > tbody > tr:nth-child(' + i + ') > td:nth-child(' + j + ') > a').attr('href'));
        ep.emit('getUrl', TagPageUrl[TagPageUrl.length - 1]);
        /**
         * 获取小类链接后
         * 为'getUrl'事件计数器计数
         **/
      }
    }
    /**
     * 'getUrl'事件达到指定次数，即一获得当前分类下所有小分类链接
     * 对小类链接进行确认并处理
     * 注册'checkUrl'事件，当所有小类链接确认后，开始收集图书信息
     */
    ep.after('getUrl', blockrow * 4, function(list) {
      TagPageUrl.forEach(function(el, index) {
        console.log(el);
        request.get(encodeURI(el)).proxy(proxyUrl).end(function(err, res) {
          ep.emit('checkUrl', el); //为'checkUrl'事件计数器计数
          if (err)
            console.error(el);
          else {
            for (var i = 0; i <= 200; i++) { //获取前两百页内容
              filteredTagPageUrl.push(el + '?start=' + i * 20 + '&type=T');
            }
          }
        });
      });
      //所有'checkUrl'事件结束后，开始收集信息
      ep.after('checkUrl', blockrow * 4, getbookstart);
    });
  }




  var getBookStart = function() {
    console.log('filteredTagPageUrl:' + filteredTagPageUrl.length);
    //利用async.mapLimit指定并发数量，调用catchBook获取书本信息
    async.mapLimit(filteredTagPageUrl, 5, function(el, callback) { catchBook(el, callback); }, function(err,results) {
      console.log("complete!");
      //所有页面采集任务结束后，等待500ms后将数据写入文件
      setTimeout(WriteFile, 500);
    });
  }
//   /**
//    * [catchBook]
//    * @param  {String}   el       [页面url]
//    * @param  {Function} callback [mapLimit回调触发]
//    */
  var catchBook = function(el, callback) {
    var delay = parseInt((Math.random() * 30000000) % 1000, 10); //设置延迟时长，模拟人为操作
    request.get(encodeURI(el)).proxy(proxyUrl).end(function(err, res) {
      if (err)
        console.error('无效链接');
      else {
        var $ = cheerio.load(res.text);
        for (var i = 1; i <= 20; i++) { //对每页的二十本书进行内容抓取
          var bookOP;
          /**    
            * 利用正则表达式处理抓取信息，这里不赘述
            * 欢迎查看github上的源码
            */
          catchData.push(bookOP);            
        }
      }
    });
    setTimeout(function() {
      //触发mapLimit回调
      callback(null, el);
    }, delay);
  }
  /**
   * [WriteFile 写入文件]
   */
  var WriteFile = function() {
    fs.writeFile('./data/' + blockName[blockCount] + '.txt', catchData, (err) => {
      if (err) throw err;
      else {
        console.log(blockName[blockCount] + ' is saved!');
        if (blockCount + 1 < blockName.length) {
          //读取下一大类
          setTimeout(function() {
            blockCount++;
            TagPageUrl = [];
            filteredTagPageUrl = [];
            catchData = [];
            getFilteredTagUrl();
          }, 3500);
        }
      }
    });
  }

